#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int BTDataType;

typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	BTDataType data;
}BTNode;

//if (root == NULL)
//{
//    return;
//}
//if (root->left == NULL && root->right == NULL)
//{
//    return;
//}
//if (root->left != NULL)
//{
//    return root->left->val != root->val ? false : isUnivalTree(root->left);
//}
//if (root->right != NULL)
//{
//    return root->right->val != root->val ? false : isUnivalTree(root->right);
//}
//return true;

//if (root == NULL)
//{
//    return;
//}
//if (root->left == NULL && root->right == NULL)
//{
//    return;
//}
//if (root->left != NULL)
//{
//    return root->left->val != root->val ? false : isUnivalTree(root->left);
//}
//if (root->right != NULL)
//{
//    return root->right->val != root->val ? false : isUnivalTree(root->right);
//}
//return true;

BTNode* BuyNode(BTDataType x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

//BTNode* CreatBinaryTree()
//{
//	BTNode* node1 = BuyNode(2);
//	BTNode* node2 = BuyNode(2);
//	BTNode* node3 = BuyNode(2);
//	BTNode* node4 = BuyNode(5);
//	BTNode* node5 = BuyNode(2);
//
//	node1->left = node2;
//	node1->right = node3;
//	node2->left = node4;
//	node2->right = node5;
//	return node1;
//}

BTNode* CreatBinaryTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(1);

	node1->left = node2;
	return node1;
}

//int count = 0;
//int count1 = 0;
//bool isUnivalTree(BTNode* root)
//{
//	if (root == NULL)
//	{
//		return;
//	}
//	if (root->left == NULL && root->right == NULL)
//	{
//		return;
//	}
//	if (root->left != NULL)
//	{
//		count++;
//		if (root->left->data != root->data)
//		{
//			count1++;
//			return false;
//		}
//		if (count1 != 0)
//		{
//			return false;
//		}
//		isUnivalTree(root->left);
//		count--;
//	}
//	if (root->right != NULL)
//	{
//		count++;
//		if (root->right->data != root->data)
//		{
//			count1++;
//			return false;
//		}
//		if (count1 != 0)
//		{
//			return false;
//		}
//		isUnivalTree(root->right);
//		count--;
//	}
//	if (count == 0)
//	{
//		return true;
//	}
//	return;
//}

int count = 0;
int count1 = 0;
bool isUnivalTree(BTNode* root)
{
    if (root == NULL)
    {
        return;
    }
    if (root->left == NULL && root->right == NULL)
    {
        return;
    }
    if (root->left != NULL)
    {
        count++;
        if (root->left->data != root->data)
        {
            count1++;
            return false;
        }
        if (count1 != 0)
        {
            return false;
        }
        isUnivalTree(root->left);
        count--;
    }
    if (root->right != NULL)
    {
        count++;
        if (root->right->data != root->data)
        {
            count++;
            return false;
        }
        if (count1 != 0)
        {
            return false;
        }
        isUnivalTree(root->right);
        count--;
    }
    if (count == 0)
    {
        return true;
    }
    return;
}

void TestBinary()
{
	BTNode* root = CreatBinaryTree();
	if (isUnivalTree(root))
	{
		printf("true\n");
	}
	else
	{
		printf("false\n");
	}
}

int main()
{
	TestBinary();
	return 0;
}